package com.example.controller;
import com.example.constants.Constants;
import com.example.model.*;
import com.example.service.BookService;
import jakarta.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;

/**
 * 图书控制层
 * 职责：接收前端请求，调用业务逻辑层，返回响应数据
 * 使用@RestController注解，表示该类是一个RESTful控制器
 * 返回的数据会自动转换为JSON格式
 */
@Slf4j
@RequestMapping("/book")  // 类级别请求映射，所有方法的请求路径都以/book开头
@RestController           // 标识为RESTful控制器，返回数据而非视图
public class BookController {

    @Autowired
    private BookService bookService;

    /**
     * 获取图书列表接口
     * 处理GET请求，获取所有图书信息
     * @return 图书列表数据，会自动转换为JSON格式
     */
    @RequestMapping("/getList") // 方法级别请求映射，完整路径为：/book/getList
    public List<BookInfo> getList() {
        // 调用业务逻辑层获取数据
        // 业务逻辑层负责处理复杂的业务规则和数据转换
        List<BookInfo> books = bookService.getBookList();

        // 返回数据给前端
        // 由于使用了@RestController，返回的List会自动转换为JSON数组
        return books;
    }

    /**
     * 添加图书接口
     * @param bookInfo 图书信息（Spring自动绑定表单参数）
     * @return 操作结果
     */
    @RequestMapping("/addBook")
    public String addBook(BookInfo bookInfo) {
        log.info("添加图书:{}", bookInfo);  // 记录添加图书的操作日志，便于问题追踪

        // 参数校验：检查必填字段是否为空
        // StringUtils.hasLength() 检查字符串不为null且长度大于0
        if (!StringUtils.hasLength(bookInfo.getBookName())
                || !StringUtils.hasLength(bookInfo.getAuthor())
                || bookInfo.getCount() == null      // 检查数值类型是否为null
                || bookInfo.getPrice() == null
                || !StringUtils.hasLength(bookInfo.getPublish())
                || bookInfo.getStatus() == null) {
            return "输入参数不合法, 请检查入参!";  // 校验失败返回错误信息
        }

        try {
            bookService.addBook(bookInfo);  // 调用业务层添加图书，实现业务逻辑分离
            return "";  // 成功返回空字符串，符合接口约定
        } catch (Exception e) {
            log.error("添加图书失败", e);  // 记录异常堆栈信息
            return e.getMessage();  // 失败返回错误信息给前端
        }
    }


    /**
     * 分页获取图书列表（添加登录检查）
     * 验证用户登录状态后返回图书列表数据
     * @param pageRequest 分页请求参数
     * @param session HTTP会话对象，用于获取用户登录信息
     * @return 包含图书列表的响应结果
     */
    @RequestMapping("/getListByPage")
    public Result getListByPage(PageRequest pageRequest, HttpSession session) {
        log.info("获取图书列表, pageRequest:{}", pageRequest);  // 记录日志
//
//        // 判断用户是否登录：检查Session中是否存在用户信息
//        if (session.getAttribute(Constants.SESSION_USER_KEY) == null) {
//            return Result.unlogin();  // 返回未登录状态
//        }
//
//        // 获取Session中的用户信息并进行类型转换
//        UserInfo userInfo = (UserInfo) session.getAttribute(Constants.SESSION_USER_KEY);
//        // 进一步验证用户信息的完整性
//        if (userInfo == null || userInfo.getId() < 0 || "".equals(userInfo.getUserName())) {
//            return Result.unlogin();  // 用户信息不完整，视为未登录
//        }

        // 用户已登录，调用服务层方法获取图书列表
        PageResult<BookInfo> pageResult = bookService.getBookListByPage(pageRequest);
        return Result.success(pageResult);  // 返回成功响应，包含图书列表数据
    }


    /**
     * 根据ID查询图书信息
     * @param bookId 图书ID
     * @return 图书信息
     */
    @RequestMapping("/queryBookById")
    public BookInfo queryBookById(Integer bookId) {
        log.info("查询图书信息, bookId:{}", bookId);  // 记录查询日志
        if (bookId == null || bookId <= 0) {        // 参数校验
            log.warn("图书ID参数不合法: {}", bookId);  // 记录警告日志
            return null;  // 返回null而不是空对象
        }
        try {
            BookInfo bookInfo = bookService.queryBookById(bookId);  // 调用业务层查询
            return bookInfo;  // 返回查询结果
        } catch (Exception e) {
            log.error("查询图书信息异常", e);  // 记录异常日志
            return null;
        }
    }

    /**
     * 修改图书信息
     * @param bookInfo 图书信息
     * @return 操作结果
     */
    @RequestMapping("/updateBook")
    public String updateBook(BookInfo bookInfo) {
        log.info("修改图书:{}", bookInfo);  // 记录修改日志
        try {
            bookService.updateBook(bookInfo);  // 调用业务层更新
            return "";  // 成功返回空字符串
        } catch (Exception e) {
            log.error("修改图书失败", e);  // 记录异常日志
            return e.getMessage();  // 失败返回错误信息
        }
    }


    /**
     * 删除图书（逻辑删除）
     * @param bookId 图书ID（与前端保持一致）
     * @return 操作结果
     */
    @RequestMapping("/deleteBook")
    public String deleteBook(@RequestParam("bookId") Integer bookId) {  // 添加@RequestParam注解
        log.info("删除图书, bookId:{}", bookId);  // 记录日志，输出要删除的图书ID
        try {
            Integer result = bookService.deleteBook(bookId);  // 调用业务层删除方法
            if (result < 1) {  // 判断受影响行数是否小于1
                return "图书删除失败, 请联系管理员";  // 返回失败信息
            }
            return "";  // 返回空字符串表示成功
        } catch (Exception e) {
            log.error("图书删除发生异常, e:", e);  // 记录异常日志
            return "图书删除失败, 请联系管理员";  // 返回异常信息
        }
    }

    /**
     * 批量删除图书
     * @param ids 图书ID列表
     * @return 操作结果
     */
    @RequestMapping("/batchDeleteBook")
    public String batchDeleteBook(@RequestParam List<Integer> ids) {  // 接收ID列表参数
        log.info("批量删除图书, ids:{}", ids);  // 记录批量删除的ID列表
        try {
            bookService.batchDeleteBook(ids);  // 调用业务层批量删除方法
            return "";  // 返回空字符串表示成功
        } catch (Exception e) {
            log.error("批量删除异常", e);  // 记录异常日志
            return "批量删除失败, 请联系管理员";  // 返回失败信息
        }
    }



}